<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Class的基本语法</title>
  <style>
      div, li, p {
        line-height: 40px;
      }
      span {
        color: red;
      }
  </style>
</head>
<body>
  <h2>基本语法介绍</h2>
  <ul>
    <li>
      Javascipt语言的传统方法是通过构造函数定义并生成新对象
    </li>
    <li>
      ES6提供了更接近传统语言的写法，引入了Class(类)这个概念作为对象的模板。通过class关键字可以定义类
    </li>
    <li>
      ES6的class可以看作只是一个语法糖，它的绝大部分功能，ES5都可以做到，新的Class写法只是让对象的写法更加清晰
    </li>
    <li>
      <span>constructor方法，就是ES5里的构造方法，而this关键字则代表实例对象</span>，也就是说，es5的构造函数Point对应ES6的Point类的构造方法
    </li>
    <li>
      在class中定义方法时，前面不需要加上function这个保留字，另外，方法之间不需要逗号分割
    </li>
    <li>
      ES6的class完全可以看作构造函数的另一种写法，使用的时候，也是直接对类使用new命令
    </li>
    <li>
      类和模块内部默认使用严格模式
    </li>
    <li>
      constructor方法是类的默认方法，通过new命令生成对象实例时自动调用该方法。一个类必须有constructor方法，如果没有，一个空的constructor方法会默认添加
    </li>
    <li>
      constructor方法默认返回实例对象(即this),不过完全可以指定返回另外一个对象，另外类必须使用new来调用，否则会报错。这是它跟普通构造函数的一个主要区别。普通构造函数不用new也可以执行
    </li>
    <li>
      类不存在变量提升，，这种规定的原因与将要提到的继承有关
    </li>
    <li>
      类的方法内部吐过含有this,它将默认指向类的实例。但是，必须非常小心，一旦单独使用该方法，很可能因为this指向的问题而报错。解决方式是，利用bind将this绑定方法运行时的环境
    </li>
    <li>
      与ES5一样，在“类”的内部可以使用get和set关键字对某个属性设置存值函数和取值函数，<span>拦截该属性的存取行为</span>
    </li>
    <li>
      如果某个方法之前加上（*），就表示该方法是一个Generator函数
    </li>
    <li>
      <span>在类中定义的方法都会被实例继承。</span>如果在一个方法前加上static关键字，就表示该方法不会被实例继承<span>(是不会被实例继承，但是还是会被子类继承)。</span>而是要通过类进行调用，称为“静态方法”
    </li>
    <li>
      静态属性指的是Class本身的属性，即Class.propname，而不是定义在实例对象（this）上的属性
    </li>
    <li>
      new.target属性，返回new命令所用的构造函数。如果构造函数不是通过new命令调用的，那么new.target就会返回undefined,因此这个属性可以确定构造函数时怎么调用的。<span>利用这个特点，可以写出不能独立使用而必须继承后才能使用的类</span>
    </li>
    <li>
      在函数外部，使用new.target会报错
    </li>
  </ul>

  <script src="./node.js"></script>
</body>
</html>